CONNESSIONE di una scheda a Microcontrollore al P.C.

 

La comunicazione avviene con protocollo RS232 via USB.

Viene utilizzata, per l’interfacciamento Hardware tra PC e scheda a Microcontrollore, la scheda FTDI232.

 

Scheda FTDI232. PinOUT

La scheda consente il collegamento via USB (solitamente tipo Mini) di un segnale seriale RS232.

Il protocollo RS232 è tra i più datati ed utilizzati in ogni ambito dell’elettronica.

Tale Protocollo di comunicazione è implementato su tutte le schede a Microcontrollore.

Descrizione della scheda FTDI232.

Come è visibile dalla illustrazione, (Fig.1) la scheda è munita di due connettori uno USB che andrà connesso al PC e l’altro a 6 pin passo 2,54mm per il collegamento alla scheda a MCU. I 9+9 pad disponibili sui due lati della scheda, danno una completa possibilità di utilizzo in particolari condizioni che non saranno trattate in questi appunti.

 Il connettore consente un comodo mezzo per collegarsi tramite Breadboard.

Un Jumper a due posizioni, consente di selezionare la tensione di lavoro della scheda da collegare, 3.3v oppure 5v.

Due led si illuminano quando avviene un trasferimento dati.  Un led in trasmissione ed uno in ricezione.

 

Specifiche collegamenti relativi alla scheda prodotta dalla  Az-Delivery’

(Per ulteriori specifiche della scheda, consultare il relativo Data sheet)

 

I collegamenti che utilizzeremo, sono solo quattro. Vcc, GND, RX, TX. Tutti e quattro i pin sono disponibili sul connettore di uscita a sei pin.

 

 

 

Per comunicare, PC e scheda a MCU hanno bisogno di programmi che mettano in comunicazione i due circuiti.

Le schede programmabili hanno avuto negli ultimi anni una diffusione massima grazie anche alla scheda Arduino che ha consentito anche ai meno esperti del campo di portare a termine progetti di discipline molte volte assolutamente lontane dalle conoscenze dell’elettronica programmabile.

Poter connettere il circuito programmabile ad un PC, aumenta esponenzialmente le possibilità dei sistemi progettati.

Inutile elencare le numerosissime possibilità che si aprono.

In questa ottica, per consentire all’ideatore dei progetti, una più possibile semplice ma completa opportunità, si è pensato di implementare la soluzione software relativa al PC con il notissimo e relativamente semplice da usare linguaggio ‘Visual Basic’.

 

 

Per questi appunti, utilizzeremo:

Lato P.C. ---- Visual Basic Versione 2022

Lato Scheda a Microcontrollore ---- linguaggio C.(Arduino Uno)

 

 

 

 

 

 

 

 

Software di gestione su P.C.

Una Nota di Attenzione alla scelta del tipo di programma da scegliere. La scelta del tipo di programma è essenziale per realizzare una comunicazione RS232. Infatti le tipologie ‘Framework .NET’ comprendono tra gli oggetti utilizzabili il componente  SerialPort’ che fa parte della .NET componente(anche per VisualC #!) 

Dopo aver installato la suite Visual Studio 2022,

1)   Creiamo un nuovo Progetto

2)   Scegliamo ‘App Windows Forms (.Net Framework)  (naturalmente Visual Basic!)

Attenzione a non confondersi

 

3)   Diamo un nome al nuovo Progetto’Comm_8Bytes_RS232’ ed accettiamo/prendiamo nota del percorso dove verrà creato il Software.

 

 

Dopo qualche secondo apparirà la schermata seguente.

 

Se non appaiono le finestre alla destra:

 

Visualizza:

--Esplora Soluzioni

--Proprietà

--output

--Elenco errori

Le finestre vanno tenute aperte da qualche parte. Io trovo comodo averle alla mia destra!

Se non dovesse apparire la Form1(finestra principale su cui metteremo i comandi vari di gestione) click su Comm_UnBytes_RS232 nella finestra ‘Esplora soluzioni e quindi doppio click  su Form1.

 

Bene!

Possiamo iniziare a scrivere il programma.

N.B. Le spiegazioni/indicazioni sono per un utente che non conosce il Visual Basic.

Naturalmente chi ha già una certa esperienza potrà saltare oppure leggere velocemente quanto segue.

Come prima progetto, vogliamo realizzare una soluzione il più semplice possibile.

Lo schema del sistema sarà quello di Fig.1

Il Sistema avrà una finestra di Input dove l’operatore metterà un dato di un byte.

Alla pressione di un tasto il dato verrà comunicato alla scheda MCU che, restituirà lo stesso dato incrementato di uno.

Prima di partire con la comunicazione, l’operatore dovrà specificare in una casella il numero di COMM che il Sistema Operativo ha attribuito per il collegamento con la nostra scheda. 😊

Il link seguente per vedere il video.            …………………………….

 

 

Collochiamo, innanzi tutto, nella nostra Form1, tutti gli oggetti necessari.

 

Da Casella degli strumenti:

Selezioniamo i seguenti Srumenti / oggetti.

Casella di testo: Un Bottone(Button)
Tre Etichette(Label)
Due caselle di testo(TextBox)
Un ComboBox
Un SerialPort

 

 

Dopo averli posizionati nella Form1:

Casella di testo: Nota che lo strumento SerialPort non è visibile. Infatti non è destinato ad essere visto

 

Con un Doppio Clik sulla Form1, si aprirà il Listato del codice relativo al programma!

Notiamo che,  in alto appare un nuovo TAB della nuova finestra per il codice.

Ora possiamo passare dalla finestra Form1 a quella di codice cliccando sui Tab.

(oppure, possiamo sempre aprire la finestra di codice con doppio clik sulla Form.

 

 

Ma a cosa servono gli strumenti/oggetti che abbiamo posizionato?

Ora lo scopriremo.

 

 

Iniziamo a scrivere un po' di codice……..

Clic sulla Label1 e ci appariranno a lato, nella finestra delle proprietà, le proprietà dell’oggetto selezionato.

Nelle Proprietà della Label1, alla voce Text, possiamo inserire la scritta che desideriamo appaia nella Label. Attualmente è riportato Label1. Lo sostituiamo scrivendo:

Elenco nomi di porti disponibili sul sistema

Infatti nella ComboBox1 sottostante, quando collegheremo il nostro cavetto USB del sistema MCU,  apparirà l’elenco delle porte disponibili su nostro PC e dovremo selezionarne una prima di iniziare la comunicazione. (esempio: COMM 3)

Nella Label1 apparirà la scritta appena inserita.

Ora passiamo al codice vero e proprio.

Con Un doppio clik sul Form1 ci troveremo nella finestra di codice ed in particolare all’interno di una chiamata:

Public Class Form1

Private Sub Form1_Load(s……………….

    ß-------------------Ci troviamo Qui!!!!!!!!!!!!!!!!!!!!!!!!!!..................

  End Sub

 

Siamo nel punto di partenza del programma. La prima cosa che viene fatta all’avvio è infatti il codice relativo alla Form1.(quando verrà caricata…. Form1_Load(s……………….)

La prima cosa sarà implementare le righe di codice che ci restituirà l’elenco dei nomi delle porte valide per il collegamento.

N.B. PortoComboBox è un normale ComboBox(quello appena posizionato sulla Form1) che io ho chiamato PortoCompoBox.

Attenzione per cambiare il nome alla ComboBox, selezionarla con un clik e nelle sue proprietà a lato cambiare il nome in PortoCompoBox.

Sarà necessario, Dichiarare la variabile portoMio per contenere i porti liberi restituiti dal sistema. Tale dichiarazione va posizionata appena sotto la scritta Public Class Form1 così sarà visibile e valida per tutto il programma.

Public Class Form1

Dim portoMio As Array 'Matrice che contiene i numeri dei Porti liberi

 

Bene!  A questo punto se voglio provare il programma, è possibile vederlo già parzialmente al lavoro. Infatti sarà già in grado di visualizzare le porte USB connesse al PC.

Per provare se funziona, avviar il programma e connettere(dopo) un dispositivo USB al PC. Cliccando nella finestrella del PortoComboBox si dovrà aprire la tendina e mostrare i dispositivi USB connessi. (Vedi Fig.2)

Nel mio caso sono connessi due dispositivi. Quale sarà Quello che mi interessa?

Da Start, Gestione dispositivi si può aprire la seguente finestra (Fig.2)

dove possiamo vedere alla voce  Porte (COMM e LPT)’  i dispositivi indicati dal nostro programma. Accanto ad ogni COMM indicata troveremo una breve descrizione che ci aiuterà a capire(almeno per esclusione) quale è la porta che dobbiamo selezionare.

Normalmente, per la scheda FTDI-USB, il Sistema Operativo  non ripota alcuna ulteriore indicazione poiché è semplicemente un adattatore di segnale.

Nel nostro caso infatti la COMM da selezionare è

L a COMM 3 è connessa ad un Programmatore STLink della STMicroelettronic(scheda NUCLEO).

 

 

 

 

 

 

 

A questo punto settiamo i parametri relativi alla comunicazione che verranno gestiti dal Componente SerialPort.

A seguire, nella    Private Sub Form1_Load(ByVal sender…. ,  scriviamo i seguenti parametri.

Riportiamo l’intera Sub Form1:

 

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        '---------------------------------------------------------------------------------------

        'È possibile ottenere un elenco di nomi di porta validi mediante il metodo GetPortNames.

        'N.B.PortoComboBox è un normale ComboBox che ho chiamato PortoComboBox

 

        PortoComboBox.DropDownStyle = ComboBoxStyle.DropDownList 'combobox-stile-listato(ComboBox-rinominato da ME in PortoComboBox)

        portoMio = IO.Ports.SerialPort.GetPortNames()  ' ---seleziona porto seriale libero

        PortoComboBox.Items.AddRange(portoMio)         ' ---seleziona porto seriale libero

        '---------------------------------------------------------------------------------------

 

        'setting serial port------------------------------

        SerialPort1.BaudRate = 9600    '—Baud Rate = 9600 bit al secondo

        SerialPort1.DataBits = 8          '---seleziona n. bit per dato

 

        SerialPort1.Parity = Parity.None ' nessuna parità

        SerialPort1.StopBits = StopBits.One 'Un bit di stop

 

        'SerialPort1.Parity = IO.Ports.Parity.None      (NON IMPLEMENTATO nel nostro caso)

        'SerialPort1.StopBits = IO.Ports.StopBits.One   (NON IMPLEMENTATO nel nostro caso)

        '-------------------------------------------------

 

        'generico--------------------------------------

        SerialPort1.DiscardNull = False ' (NON IMPLEMENTATO nel nostro caso)

        SerialPort1.DtrEnable = False   ' (NON IMPLEMENTATO nel nostro caso)

        SerialPort1.RtsEnable = False    ' (NON IMPLEMENTATO nel nostro caso)

        SerialPort1.Handshake = Handshake.None ' (NON IMPLEMENTATO nel nostro caso)

 

        SerialPort1.ParityReplace = 63  ' (NON necessario ma può tornare utile!)

        '--------buffer----------------

        SerialPort1.ReadBufferSize = 4096  ' (una dimensione accettabile per il buffer di lettura)

        SerialPort1.WriteBufferSize = 4096  ' (una dimensione accettabile per il buffer di scrittura)

        '----------timeout---------------

        SerialPort1.ReadTimeout = -1  ' Timeout di lettura in millisecondi(-1=infinito—valore di default)

        SerialPort1.WriteTimeout = -1  ' Timeout di lettura in millisecondi(-1=infinito—valore di default)

        '-------------------------------------

        SerialPort1.ReceivedBytesThreshold = 1 ' defacult

    End Sub

 

 

Possiamo notare, dopo l’avvio del programma, che nella finestra del Codice è apparsa la scritta ‘Imports System.IO.Ports’ all’inizio del Listato.

Per l’esecuzione del programma quindi è necessario importare questa parte di codice e l’ide ha provveduto automaticamente!!!.

 

Imports System.IO.Ports

 

Public Class Form1

    Dim portoMio As Array 'Matrice che contiene i numeri dei Porti liberi

 

 

    Private Sub Form1_Load(se……………………………..

 

 

A questo punto, il programma ha tutte le informazioni per realizzare laa comunicazione. Manca ora l’avvio e la gestione dei dati inviati/ricevuti. Per questo scopo utilizzeremo il Bottone(Button1).

Facendo doppio clik  sul Button1, automaticamente ci troveremo nella finestra di codice già all’interno della sub che definirà le operazioni da svolgere quando verrà premuto  il Button1. Tale Sub viene creata automaticamente.

 

 

 

Segue il codice dell’intera SubButton1_Click:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

 

        'assegna il numero di COMM precedentemente selezionato in PortoComboBox

        SerialPort1.PortName = PortoComboBox.Text

 

        '+++++++++++++++++++++++++++++   TX     ++++++++++++++++++++++++++++++++++++++++++++++++++++

        Dim arr(4095) As Byte  'Dati da trasmettere

       

        arr(0) = Val(TextBox1.Text) 'scrive nella matrice alla posizione di indice0 il dato nella TextBox1

 

        SerialPort1.Open()   ' apre comunicazione

        '------------------------

        SerialPort1.Write(arr, 0, 1) 'scrive il dato

        '++++++++++++++++++++++++++++  fine TX  ++++++++++++++++++++++++++++++++++++++++++++++++++++++

 

 

         ' appena finita la trasmissione alla scheda MCU inizia la ricezione del dato Dalla scheda al PC. Il dato ricevuto sarà uguale a   

         quello inviato incrementato di uno

 

 

        '+++++++++++++++++++++++++++++  RX   ++++++++++++++++++++++++++++++++++++++++++++

        'Legge un byte (PC=RX)

        Dim s(0 To 4095) As Byte 'Dati da ricevere

        Dim n = 0    ' n= contatore dati

 

       ' -------predisposto per la lettura di più dati!!!!------------------------

        Do

            s(n) = SerialPort1.ReadByte.ToString ' legge dato

            n = n + 1

        Loop While n = 0  ' non looppa poiche acquisisce un solo dato

        '++++++++++++++++++++++++++++  fine RX  ++++++++++++++++++++++++++++++++++++++++++++++++++++++

 

        '-----------------------------------

        SerialPort1.Close()  ' chiude comunicazione

        '-------------------

        TextBox2.Text = s(0)  ' scrive il dato ricevuto nella TextBox2

    End Sub

 

 

Spiegazione codice SubButton1_Click.

 

Possiamo distinguere quattro fasi:

1)    SerialPort1.PortName = PortoComboBox.Text

Assegna all’oggetto SerialPort1  il COMM..libero precedentemente assegnato dal sistema all’avvio e presente nella casella PortoComboBox.text.

 

2)     Trasmissione del dato

---Dimensiona array arr(0 to 4095)

---n=0 contatore dati

---Apre la comunicazione

---Scrive l’unico dato da scrivere.

 

3)    Ricezione del dato

---Dimensiona array s(0 to 4095)

---n=0 contatore dati

          --- ciclo lettura dati (nel nostro caso solo uno!)

                   ---Legge il dato dalla matrice con pedice n

                   n=n+1

                    se n<>0 termina (fa solo un loop!)

4)    Scrive il dato acquisito(che verrà incrementato di uno dalla scheda MCU) nella TextBox2

 

Non dimentichiamo di dare una indicazione da mettere nelle Label2 e Label3. Saranno le specifiche per le sottostanti TextBox.

Click sulla Label2, appariranno le Proprietà della stessa. Alla voce Text inserire ‘Dato da mandare alla scheda MCU’

Click sulla Label3, appariranno le Proprietà della stessa. Alla voce Text inserire ‘Dato ricevuto dalla scheda MCU[=dato mandato+1]’

 

Come si presenta l’interfaccia grafica a fine lavoro!!!